package com.haois.component.security;


import com.haois.component.common.enu.JwtEnum;
import com.haois.component.constant.StatusCode;
import io.jsonwebtoken.JwtBuilder;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;

import javax.crypto.SecretKey;
import javax.security.auth.Subject;
import java.util.Date;

/**
 * description
 *
 * @author RuiHaoZ on GCU
 * @date 2017/3/17 9:18
 */
public class ProduceJwt {

    /*
    iss(Issuser)：代表这个JWT的签发主体；
    sub(Subject)：代表这个JWT的主体，即它的所有人；
    aud(Audience)：代表这个JWT的接收对象；
    exp(Expiration time)：是一个时间戳，代表这个JWT的过期时间；
    nbf(Not Before)：是一个时间戳，代表这个JWT生效的开始时间，意味着在这个时间之前验证JWT是会失败的；
    iat(Issued at)：是一个时间戳，代表这个JWT的签发时间；
    jti(JWT ID)：是JWT的唯一标识。
    */

    private HandleToken handleToken = new HandleToken();

    public JwtBuilder createJwtBuilder(String jwtId) {
        SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
        SecretKey key = handleToken.generalKey();
        JwtBuilder jwtBuilder = Jwts.builder();
        jwtBuilder.setHeaderParam("tye", "jwt");
        jwtBuilder.setHeaderParam("alg", "HS256");
        jwtBuilder.setId(jwtId);
        jwtBuilder.setIssuer(StatusCode.JWT_ISSUER);
        //加密
        jwtBuilder.signWith(signatureAlgorithm, key);
        return jwtBuilder;
    }

    public String produceToken(Subject subject, Date issuedTime, JwtEnum jwtEnum) {
        String subStr = handleToken.generalSubject(subject);
        return this.produceToken(subStr, issuedTime, jwtEnum);
    }

    public String produceToken(String subStr, Date issuedTime, JwtEnum jwtEnum) {
        JwtBuilder jwtBuilder = this.createJwtBuilder(StatusCode.JWT_ID);
        if (jwtEnum.getExpiration() > 0) {
            long thisTime = System.currentTimeMillis();
            long expMillis = thisTime + jwtEnum.getExpiration();
            Date exp = new Date(expMillis);
            jwtBuilder.setExpiration(exp);
        }
        jwtBuilder.setIssuedAt(issuedTime);
        //签发时间

        if (this.isSetIssuedAt()) {
            jwtBuilder.setNotBefore(issuedTime);
        }
        jwtBuilder.setAudience(jwtEnum.getAudience());

        jwtBuilder.setSubject(subStr);
        //接受主体，此处为登录的用户
        return jwtBuilder.compact();
    }

    public boolean isSetIssuedAt() {
        return true;
    }


}
